package cn.dt.ymcc.service.impl;

import cn.dt.ymcc.GlobalException;
import cn.dt.ymcc.constants.SystemEnumError;
import cn.dt.ymcc.dto.RegisterDto;
import cn.dt.ymcc.service.IVerifycodeService;
import cn.dt.ymcc.util.StrUtils;
import cn.dt.ymcc.util.VerifyCodeUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.TimeUnit;
@RestController
public class VerifycodeServiceImpl implements IVerifycodeService {
    @Autowired
    private RedisTemplate<Object,Object> redisTemplate;
    /**
     * 获取图形验证码，
     *
     * @param key
     * @return
     */
    @Override
    public String imageCode(String key) {


        if (!StringUtils.hasLength(key)) {
            throw new GlobalException("key不能为空");
        }
        String code = StrUtils.getComplexRandomString(4);
        redisTemplate.opsForValue().set(
                key,
                code,
                4,
                TimeUnit.MINUTES
        );
        return VerifyCodeUtils.verifyCode(100, 40, code);
    }

    /**
     * 手机短信码发送
     * @param dto
     */
    @Override
    public void sendSmsCode(RegisterDto dto) {
        String phone = dto.getMobile();
        String imageCodeValue = dto.getImageCode();
        String imageCodeKey = dto.getImageCodeKey();
        //*发送手机验证码之前：
        //* 1.判断是否为空
        if (StringUtils.isEmpty(phone) ||
                StringUtils.isEmpty(imageCodeValue) ||
                StringUtils.isEmpty(imageCodeKey)) {
            throw new GlobalException(SystemEnumError.SYSTEM_ENUM_ERROR.getMessage());
        }
        //* 从redis拿到缓存的图片验证码
        Object codeTmp = redisTemplate.opsForValue().get(imageCodeKey);
        //* 2.判断图片验证码是否过期
        if (codeTmp == null) {
            //*  2.1过期提醒
            throw new GlobalException(SystemEnumError.SYSTEM_CODE_EXPIRED.getMessage());
        }
        //* 3.判断输入的图形验证码是否一致
        if (!codeTmp.toString().equalsIgnoreCase(imageCodeValue)) {
            //*  3.1不一致提醒
            throw new GlobalException("您输入的图形验证码有误，请重新输入");
        }
        //*准备发送验证码阶段：
        //* 4.从数据库中查手机号是否存在

        //拼接手机号register:15984281738
        String phoneKey = "register:" + phone;
        //* 5.从redis获取内存的手机验证码判断是否存在
        Object SmsCodeTmp = redisTemplate.opsForValue().get(phoneKey);
        String smsCode = "";
        if (SmsCodeTmp != null) {
            //*  5.1 存在的时候
            Long oldTime = Long.valueOf(SmsCodeTmp.toString().split(":")[1]);
            long nowTime = System.currentTimeMillis();
            //*  5.1.1 判断是否过期(通过时间戳进行判断)，过期提醒
            if (nowTime - oldTime < 1000 * 60) {
                //时间小于1分钟，有人在搞事
                throw new GlobalException("请不要持续获取验证码！！");
            }
            //*  5.1.2 未过期就继续使用，在后面更新时间
            smsCode = SmsCodeTmp.toString().split(":")[0];
        } else {
            //*  5.2 过期或者不存在的时候
            //*      5.2.1 使用工具类生成新的手机验证码
            smsCode = StrUtils.getRandomString(4);
        }
        //设置过期时间
        String smsCodeValue = smsCode + ":" + System.currentTimeMillis();
        redisTemplate.opsForValue().set(
                phoneKey,
                smsCodeValue,
                10,
                TimeUnit.MINUTES
        );

        //* 6.发送短信
//        SmsUtil.sendSms(phone,"验证码是"+smsCode);
        System.out.println("验证码是" + smsCode);
        //7.保存日志信息
    }
}
